#include <stdio.h>
#include <stdlib.h>
typedef int ElementType; // 元素类型 (typedef作用是起别名)

// 栈节点结构体
typedef struct Stack
{
    ElementType data; // 数据域
    struct Stack* next; // 指针域
}Stack;

//初始化栈
Stack* InitStack() {
    Stack* s = (Stack*)malloc(sizeof(Stack)); // 动态分配内存
    s->data = 0; // 初始化数据域
    s->next = NULL; // 初始化指针域
    return s;
}
//判断栈是否为空
int IsEmpty(Stack* s) {
    if (s -> next  == NULL) {
        printf("栈空\n");
        return 1; // 栈空
    }
    else {
        printf("栈不空\n");
        return 0; // 栈不空
    }
}

//入栈（头插法）
Stack* Push(Stack* s, ElementType value) {
    Stack* newNode = (Stack*)malloc(sizeof(Stack)); // 分配新节点内存
    if (!newNode) { // 内存分配失败
        printf("内存分配失败，无法插入元素\n");
        return NULL; // 插入失败
    }
    newNode->data = value; // 设置新节点数据域
    newNode->next = s->next; // 新节点指针域指向当前栈顶节点
    s->next = newNode; // 头结点指针域指向新节点
    return s; // 返回栈顶指针
}

//出栈
int Pop(Stack* s, ElementType* value) {
    if (IsEmpty(s)) return 0; // 栈空
    Stack* temp = s->next; // 临时指针指向栈顶节点
    *value = temp->data; // 获取栈顶元素
    s->next = temp->next; // 头结点指针域指向下一个节点
    free(temp); // 释放栈顶节点内存
    return 1; // 出栈成功
} 

//获取栈顶元素
int Peek(Stack* s, ElementType* value) {
    if (IsEmpty(s)) return 0; // 栈空
    *value = s->next->data; // 获取栈顶元素
    return 1;
}

int main(){
    Stack* s = InitStack();
    s = Push(s, 10);
    s = Push(s, 20);
    s = Push(s, 30);
    return 0;
}